package framework;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;

import app.MainGuiRegistrationForm;

//import javax.naming.NamingException;

/**
 * Класс для работы с БД.
 */
public class DataBaseUtils {

	private static Logger logger = Logger.getInstance();
	private static String driverName = "oracle.jdbc.driver.OracleDriver";
	private static PropertiesResourceManager props;
	public static String pathToMainScripts = null;

	// Скрипты для версии 2.0.X
	// public static final String PATH_TO_MAIN_SCRIPTS
	// ="jar:file:/D:/Lanit223FZ_RegOrgApp_v1.0.jar!/scripts/";

	private static final String CLEAN_PPA_ORG_BY_ID = "CLEAN_ONE_FZ223_PPA_ORG_by_ID.sql";

	// INSERT SCRIPTS
	public static final String INSERT_ADDRESS_SCRIPT = "INSERT_ORG_ADDRESS.sql";
	public static final String INSERT_AGENCY_SCRIPT = "INSERT_AGENCY.sql";
	public static final String INSERT_USER_SCRIPT = "INSERT_USER.sql";
	public static final String INSERT_USER_PERMISSIONS_SCRIPT = "INSERT_USER_PERMISSIONS.sql";
	public static final String INSERT_FAKE_USER_SCRIPT = "INSERT_FAKE_USER.sql";
	public static final String INSERT_INT_SETTINGS_SCRIPT = "INSERT_INT_SETTINGS.sql";
	public static final String INSERT_INT_USER_SCRIPT = "INSERT_INT_USER.sql";

	// Названия сущностей в скриптах

	// Сущности для организации
	private static final String AGENCY_ID = "&&AGENCY_ID";
	private static final String OGRN = "&&OGRN";
	private static final String INN = "&&INN";
	private static final String KPP = "&&KPP";
	private static final String FULL_NAME = "&&FULL_NAME";
	private static final String ADDRESS_ID = "&&ADDRESS_ID";
	private static final String PHONE = "&&PHONE";
	private static final String WEBSITE = "&&WEBSITE";
	private static final String EMAIL = "&&EMAIL";
	public static final String ZIP_CODE = "&&ZIP_CODE";
	public static final String ZIP_CODE_REPLACEMENT = "223344";
	private static final String IS_INT_ALLOWED = "&&IS_INT_ALLOWED";
	private static final String INT_FLAG = "&&INT_FLAG";


	// Сущности для пользователя
	private static final String LOGIN = "&&LOGIN";
	private static final String PASSWORD = "&&PASSWORD";
	private static final String USER_ID = "&&USER_ID";
	private static final String FIRST_NAME = "&&FIRST_NAME";
	private static final String MIDDLE_NAME = "&&MIDDLE_NAME";
	private static final String LAST_NAME = "&&LAST_NAME";

	// Сообщения о результатах запросов к БД

	public static String resultOfcheckOrganizationIsUnique = null;
	public static String resultOfcheckUserIsUnique = null;
	public static HashMap<String, String> orgCheckResultList = new HashMap<String, String>();
	public static HashMap<String, String> userCheckResultList = new HashMap<String, String>();

	// Результаты поиска данных в БД
	public  final String OGRN_CHECK_RESULT = "OGRN";
	public final String INN_CHECK_RESULT = "INN";
	public  final String KPP_CHECK_RESULT = "KPP";
	public  final String LOGIN_CHECK_RESULT = "LOGIN";
	public  final String INT_LOGIN_CHECK_RESULT = "INT_LOGIN";
	public  final String CHECK_RESULT_OK = "Реквизит свободен!";

	// private static final String ORG_OGRN = "&&OGRN_NUM";
	// Переменные бд разных стендов
	public static String serverName, portNumber, sid, username, password;

	/**
	 * Выполняет подключение к БД
	 * 
	 * @param user
	 *            пользователь
	 * @param pass
	 *            пароль
	 * @return подключение
	 */
	public static Connection connectToDb(String user, String pass) {
		// Intialize db variables
		Connection connection = null;
		try {
			// Load the JDBC driver
			Class.forName(driverName);
			/*
			 * logger.info(String.format("Значения переменных: driverName=%1$s",
			 * driverName));
			 */
			// Create a connection to the database
			String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber
					+ ":" + sid;
			// logger.info(String.format("Значения переменных: url=%1$s", url));
			connection = DriverManager.getConnection(url, user, pass);

			/*
			 * Logger.info(String.format(
			 * "Значения переменных: url=%1$s, user=%2$s, pass=%3$s", url, user,
			 * pass));
			 */
		} catch (ClassNotFoundException e) {
			logger.error("Не удалось подключиться к БД " + e.getMessage());
		} catch (SQLException e) {
			logger.error("Не удалось подключиться к БД " + e.getMessage());
		}
		return connection;
	}

	/**
	 * Выполняет скрипт
	 * 
	 * @param pathToScript
	 *            путь к скрипту
	 * @param replaceMap
	 *            карта реплейса
	 */
	public void runScripts(String pathToScript,
			HashMap<String, String> replaceMap) {
		runScripts(pathToScript, replaceMap, false, false);
	}

	/**
	 * /** Выполняет скрипт без реплейса
	 * 
	 * @param pathToScript
	 *            путь к скрипту
	 * @param replaceMap
	 *            карта реплейса
	 */
	public void runScriptsNoReplaces(String pathToScript,
			HashMap<String, String> replaceMap) {
		Logger.info("runScript for :" + replaceMap.toString());
		runScripts(pathToScript, replaceMap, false, true);
	}

	/**
	 * Возвращает ID для организации
	 * 
	 * @param orgFullName
	 *            название организации
	 * @param ogrn
	 *            огрн
	 * @return ID организации
	 */
	public String getCustomerId(String orgFullName, String ogrn) {
		initializeDB();
		String id = "";

		Connection connection = connectToDb(username, password);
		try {
			Statement st = connection.createStatement();
			int status = st
					.executeUpdate("SELECT ID FROM FZ223_PPA.AGENCY WHERE FULL_NAME='"
							+ orgFullName + "' AND ogrn = '" + ogrn + "'");
			if (status == 1) {
				ResultSet r = st.getResultSet();
				r.next();
				id = r.getNString("id");
				Logger.info("ID организации " + orgFullName + ": " + id);
			} else {
				Logger.warn("Не удалось получить ID для организации "
						+ orgFullName);
			}
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
		return id;
	}

	/**
	 * Проверяет, нет ли уже организации с вводимыми данными в БД
	 * 
	 * @param fullName
	 *            полное название организации
	 * @param ogrn
	 *            ОГРН организации
	 * @param kpp
	 *            КПП организации
	 * @param inn
	 *            ИНН организации
	 * @return ID организации
	 */
	public  String checkOrganizationIsUnique(String fullName,
			String ogrn, String kpp, String inn) {
		initializeDB();
		String tempResult = "";

		String queryOgrn = "SELECT ID FROM FZ223_PPA.AGENCY WHERE OGRN='"
				+ ogrn + "'";
		String queryInn = "SELECT ID FROM FZ223_PPA.AGENCY WHERE  INN = '"
				+ inn + "'";
		String queryKpp = "SELECT ID FROM FZ223_PPA.AGENCY WHERE  KPP = '"
				+ kpp + "'";

		// выполняем 3 селекта и заполняем результатами массив

		// ищем организацию по ОГРН
		findCheckResults(queryOgrn, OGRN_CHECK_RESULT);

		// ищем организацию по ИНН
		findCheckResults(queryInn, INN_CHECK_RESULT);

		// ищем организацию по КПП
		findCheckResults(queryKpp, KPP_CHECK_RESULT);

		for (String key : orgCheckResultList.keySet()) {
			Logger.info("Результат по " + key + " : "
					+ orgCheckResultList.get(key));
		}

		return tempResult;
	}

	/**
	 * Записывает результат выполнения запроса в HashMap
	 * 
	 * @param query
	 *            SQL запрос
	 * @param resultListKey
	 *            ключ результата в HashMap
	 */

	private  void findCheckResults(String query, String resultListKey) {
		String tempResult = "";

		Connection connection = connectToDb(username, password);

		try {
			Statement st = connection.createStatement();
			int rr = st.executeUpdate(query);
			ResultSet rs = st.getResultSet();
			rs.next();

			if (rr != 0) {
				tempResult = rs.getNString(1);
			} else {
				tempResult = CHECK_RESULT_OK;
			}
			orgCheckResultList.put(resultListKey, tempResult);
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
	}

	/**
	 * Возвращает результаты из HashMap
	 * 
	 * @param resultListKey
	 *            ключ результата в HashMap
	 */

	public String getCheckResults(String resultListKey) {
		return orgCheckResultList.get(resultListKey);
	}

	/**
	 * Проверяет, нет ли уже пользователя с вводимыми данными в БД
	 * 
	 * @param login
	 *            логин юзера
	 * @return USER_ID пользователя
	 */
	public  String checkUserIsUnique(String login, String resultListKey) {
		initializeDB();
		String tempResult = "";
		String queryLogin = "SELECT USER_ID FROM FZ223_PPA.USERS WHERE LOGIN='"
				+ login + "'";

		// ищем юзера по логину
		findCheckResults(queryLogin, resultListKey);

		return tempResult;
	}

	/**
	 * Возвращает ОГРН для организации
	 * 
	 * @param orgName
	 *            название организации
	 * @return ОГРН организации
	 */
	private String getOgrn(String orgName) {
		initializeDB();
		String id = "";
		Connection connection = connectToDb(username, password);
		try {
			Statement st = connection.createStatement();
			int status = st
					.executeUpdate("SELECT OGRN FROM FZ223_ppa.agency where full_name='"
							+ orgName + "'");
			if (status == 1) {
				ResultSet r = st.getResultSet();
				r.next();
				id = r.getNString("ogrn");
				Logger.info("ОГРН организации " + orgName + ": " + id);
			} else {
				Logger.warn("Не удалось получить ID для организации " + orgName);
			}
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
		return id;
	}

	/**
	 * Возвращает ADDRESS_ID для будущей организации по ZIP_CODE
	 * 
	 * @param zipCode
	 *            - поиск адреса по зип коду (по умолчанию = 223344)
	 * @return ADDRESS_ID из таблицы FZ223_PPA.AGENCY_ADDRESS
	 */
	public static String getAddressId(String zipCode) {
		initializeDB();
		String id = "";
		Connection connection = connectToDb(username, password);
		try {
			Statement st = connection.createStatement();

			int status = st
					.executeUpdate("SELECT MAX(ID) FROM fz223_ppa.agency_address WHERE zip ='"
							+ zipCode + "'");
			if (status == 1) {
				ResultSet r = st.getResultSet();
				r.next();
				id = r.getNString("MAX(ID)");
				Logger.info("Значение ADDRESS_ID для кода " + zipCode + ": "
						+ id);
			} else {
				Logger.warn("Не удалось получить ID для адреса " + zipCode);
			}
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
		return id;
	}

	/**
	 * Возвращает USER_ID по логину и ОГРН организации
	 * 
	 * @param login
	 *            логин
	 * @param ogrn
	 *            огрн
	 * @param isFake
	 *            0 = обычный юзер, 1 = юзер интеграции
	 * @return USER_ID
	 */
	public String getUserId(String login, String ogrn, int isFake) {
		initializeDB();
		String id = "";
		Connection connection = connectToDb(username, password);
		try {
			Statement st = connection.createStatement();
			String query = "SELECT USER_ID FROM FZ223_ppa.users where login='"
					+ login
					+ "' AND agency_id= (select ID from fz223_ppa.agency where ogrn = '"
					+ ogrn + "') AND is_fake = " + isFake;
			System.out.println("getUserId query = " + query);
			int status = st.executeUpdate(query);
			if (status == 1) {
				ResultSet r = st.getResultSet();
				r.next();
				id = r.getNString("USER_ID");
				Logger.info("USER_ID = " + id);
			} else {
				Logger.warn("Не удалось получить USER_ID для логина" + login);
			}
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
		return id;
	}

	/**
	 * Инициализирует некоторые переменные для работы с бд
	 */
	public static void initializeDB() {
		initProperties();
		try {
			serverName = System.getProperty("hostnamedb") == null ? props
					.getProperty("hostnamedb") : System
					.getProperty("hostnamedb");
			/*
			 * logger.info(String.format(
			 * "Переменная serverName=%1$s успешно проинициализирована",
			 * serverName));
			 */
		} catch (Exception e) {
			Logger.info(String.format(
					"Переменная serverName не проинициализирована", serverName));
			e.printStackTrace();
		}
		try {
			portNumber = System.getProperty("portdb") == null ? props
					.getProperty("portdb") : System.getProperty("portdb");
			/*
			 * logger.info(String.format(
			 * "Переменная portNumber=%1$s успешно проинициализирована",
			 * portNumber));
			 */
		} catch (Exception e) {
			Logger.info(String.format(
					"Переменная portNumber не проинициализирована", portNumber));
			e.printStackTrace();
		}
		try {
			sid = System.getProperty("sid") == null ? props.getProperty("sid")
					: System.getProperty("sid");
			/*
			 * logger.info(String.format(
			 * "Переменная sid=%1$s успешно проинициализирована", sid));
			 */
		} catch (Exception e) {
			Logger.info(String.format("Переменная sid не проинициализирована",
					sid));
			e.printStackTrace();
		}
		try {
			username = System.getProperty("usernamedb") == null ? props
					.getProperty("usernamedb") : System
					.getProperty("usernamedb");
			/*
			 * logger.info(String.format(
			 * "Переменная username=%1$s успешно проинициализирована",
			 * username));
			 */
		} catch (Exception e) {
			Logger.info(String.format(
					"Переменная username не проинициализирована", username));
			e.printStackTrace();
		}
		try {
			password = System.getProperty("passworddb") == null ? props
					.getProperty("passworddb") : System
					.getProperty("passworddb");
			/*
			 * logger.info(String.format(
			 * "Переменная password=%1$s успешно проинициализирована",
			 * password));
			 */
		} catch (Exception e) {
			Logger.info(String.format(
					"Переменная password не проинициализирована", password));
			e.printStackTrace();
		}
	}

	private static void initProperties() {
		
		int i = MainGuiRegistrationForm.getSelectedStend();
		switch (i) {
		case 1:
			props = new PropertiesResourceManager("selenium_kpak.properties");
			pathToMainScripts = "/scripts/KPAK/";
			break;
		case 2:
			props = new PropertiesResourceManager("selenium_tpak.properties");
			pathToMainScripts = "/scripts/TPAK/"; 
			break; 
		case 4:
			props = new PropertiesResourceManager("selenium_int.properties");
			pathToMainScripts = "/scripts/INT/";
			break;
		default:
			break;
		}

	}

	/**
	 * Удаляет организацию по названию
	 * 
	 * @param orgName
	 *            наименование организации
	 * @param version
	 *            версия стенда
	 */
	public void deleteOrganizationByName(String orgName, String ogrn,
			String version) {
		String fullPath = pathToMainScripts + CLEAN_PPA_ORG_BY_ID;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		String id = getCustomerId(orgName, ogrn);
		replaceMap.put(AGENCY_ID, id);
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Выполняет селект
	 * 
	 * @param pathToScript
	 *            путь к скрипту
	 * @param replaceMap
	 *            карта реплейсов
	 * @param columnLabel
	 *            наименование колонки, из которой делается селект
	 * @return результат
	 */
	public String select(String pathToScript,
			HashMap<String, String> replaceMap, String columnLabel) {
		try {
			return runScripts(pathToScript, replaceMap, true, false).getString(
					columnLabel);
		} catch (SQLException e) {
			logger.debug(e.getMessage());
		}
		return "";
	}

	/**
	 * Выполняет скрипт из файла
	 * 
	 * @param pathToScript
	 *            путь к скрипту
	 * @param replaceMap
	 *            таблица символов, которые нужно заменить в каждой строке
	 *            замена ';' заменить на '' сществует по умолчанию.
	 * @param isSelect
	 *            это селект?
	 * @param noReplace
	 *            делать реплейс?
	 * @return ResultSet
	 */
	private ResultSet runScripts(final String pathToScript,
			HashMap<String, String> replaceMap, boolean isSelect,
			boolean noReplace) {
		initializeDB();


		InputStream templateStream = getClass().getResourceAsStream(
				pathToScript);
		if (templateStream == null) {
			logger.fatal("Отустствует скрипт: " + pathToScript);
		}

		try {

			DataInputStream in = new DataInputStream(templateStream);
			BufferedReader br = new BufferedReader(new InputStreamReader(in,
					"UTF-8"));

			String strLine;

			Connection connection = connectToDb(username, password);
			int lineCounter = 0;
			while ((strLine = br.readLine()) != null) {

				if (strLine.substring(0, 1).equals("-")) {
					lineCounter++;
					continue;
				}
				// делаем необходимые замены в скрипте
				for (String key : replaceMap.keySet()) {
					strLine = strLine.replace(key, replaceMap.get(key));
				}
				try {
					Statement st = connection.createStatement();
					int status;
					
					if (noReplace) {
						status = st.executeUpdate(strLine);
					} else {
						status = st.executeUpdate(strLine.replace("; ", "")
								.replace(";", ""));
					}
					if (status == 1) {
						if (isSelect) {
							ResultSet r = st.getResultSet();
							r.next();
							return r;
						} else {
							Logger.info("Запрос из строки " + lineCounter
									+ " выполнился успешно");
							connection.commit();
						}
					} else {
						System.out.println("Запрос из строки " + lineCounter
								+ " не удался");
					}
				} catch (SQLException e) {
					System.out.println(e.getMessage());
				}
				lineCounter++;
			}
		} catch (FileNotFoundException e) {
			logger.debug(e.getMessage());
		} catch (IOException e) {
			logger.debug(e.getMessage());
		}
		return null;
	}

	/**
	 * Выполняет инсерт нового адреса в базу данных
	 * 
	 */

	public void insertOrgAddress() {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_ADDRESS_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(ZIP_CODE, ZIP_CODE_REPLACEMENT);
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Вставляет новую организацию в таблицу FZ223_PPA.AGENCY
	 * 
	 * @param fullName
	 *            = полное название организации
	 * @param ogrn
	 *            = ОГРН организации
	 * @param inn
	 *            = ИНН организации
	 * @param kpp
	 *            = КПП организации
	 * @param address_id
	 *            = id соответствующего адреса из таблицы
	 *            FZ223_PPA.AGENCY_ADDRESS
	 * @param phone
	 *            = телефон организации
	 * @param website
	 *            = сайт организации
	 * @param email
	 *            = адрес электронной почты для системных уведомлений
	 *            организации (нужен при регистрации, например)
	 * 
	 */
	public void insertOrganization(String fullName, String ogrn, String inn,
			String kpp, String address_id, String phone, String website,
			String email, boolean isIntAllowed) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_AGENCY_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(FULL_NAME, fullName);
		replaceMap.put(OGRN, ogrn);
		replaceMap.put(INN, inn);
		replaceMap.put(KPP, kpp);
		replaceMap.put(ADDRESS_ID, address_id);
		replaceMap.put(PHONE, phone);
		replaceMap.put(WEBSITE, website);
		replaceMap.put(EMAIL, email);
		if (isIntAllowed == true) {
			replaceMap.put(IS_INT_ALLOWED, "1");
		} else {
			replaceMap.put(IS_INT_ALLOWED, "0");
		}
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Вставляет нового пользователя в таблицу FZ223_PPA.USERS для организации
	 * по ее fullName + ogrn
	 * 
	 * @param login
	 *            = логин юзера
	 * @param firstName
	 *            = имя юзера
	 * @param middleName
	 *            = отчество юзера
	 * @param lastName
	 *            = фамилия юзера
	 * @param fullName
	 *            = название организации
	 * @param ogrn
	 *            = ogrn организации
	 */
	public void insertUser(String login, String firstName, String middleName,
			String lastName, String fullName, String ogrn) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_USER_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(LOGIN, login);
		replaceMap.put(FIRST_NAME, firstName);
		replaceMap.put(MIDDLE_NAME, middleName);
		replaceMap.put(LAST_NAME, lastName);
		replaceMap.put(FULL_NAME, fullName);
		replaceMap.put(OGRN, ogrn);
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Вставляет нового пользователя интеграции в таблицу FZ223_PPA.USERS для
	 * организации по ее fullName + ogrn
	 * 
	 * @param login
	 *            = логин юзера интеграции
	 * @param password
	 *            = пароль интеграции
	 * @param fullName
	 *            = название организации
	 * @param ogrn
	 *            = ogrn организации
	 */
	public void insertFakeUser(String login, String password, String fullName,
			String ogrn) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_FAKE_USER_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(LOGIN, login);
		replaceMap.put(PASSWORD, password);
		replaceMap.put(FULL_NAME, fullName);
		replaceMap.put(OGRN, ogrn);
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Проставляет ВСЕ права пользователю в таблицу FZ223_PPA.PERMISSIONS
	 * 
	 * @param user_id
	 *            = ID юзера
	 * @param agency_id
	 *            = id организации
	 */
	public void insertUserPermissions(String user_id, String agency_id) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_USER_PERMISSIONS_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(USER_ID, user_id);
		replaceMap.put(AGENCY_ID, agency_id);
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Вставляет настройки интеграции в таблицу FZ223_PPA.INT_SETTINGS для
	 * организации по ее fullName + ogrn
	 * 
	 * @param fullName
	 *            = название организации
	 * @param ogrn
	 *            = ogrn организации
	 * @param isIntFlagChecked
	 *            = проставлен ли флаг "Проставить права интеграции"
	 */
	public void insertIntSettings(String fullName, String ogrn,
			boolean isIntFlagChecked) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_INT_SETTINGS_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(FULL_NAME, fullName);
		replaceMap.put(OGRN, ogrn);
		if (isIntFlagChecked == true) {
			replaceMap.put(INT_FLAG, "1");
		} else {
			replaceMap.put(INT_FLAG, "0");
		}
		runScripts(fullPath, replaceMap);
	}

	/**
	 * Вставляет нового пользователя интеграции в таблицу FZ223_PPA.INT_USERS
	 * для организации по ее fullName + ogrn
	 * 
	 * @param login
	 *            = логин юзера интеграции
	 * @param password
	 *            = пароль интеграции
	 * @param fullName
	 *            = название организации
	 * @param ogrn
	 *            = ogrn организации
	 */
	public void insertIntUser(String login, String password, String fullName,
			String ogrn) {
		initProperties();
		String fullPath = pathToMainScripts + INSERT_INT_USER_SCRIPT;
		HashMap<String, String> replaceMap = new HashMap<String, String>();
		replaceMap.put(LOGIN, login);
		replaceMap.put(PASSWORD, password);
		replaceMap.put(FULL_NAME, fullName);
		replaceMap.put(OGRN, ogrn);
		runScripts(fullPath, replaceMap);
	}
}
